home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / bgui12.lha / demos / BGUIPlayer / Disk.c < prev    next >
C/C++ Source or Header  |  1995-06-11  |  8KB  |  314 lines

  1. /*
  2.  *    DISK.C
  3.  */
  4.  
  5. #include "BGUIPlayer.h"
  6.  
  7. /*
  8.  *    Export data.
  9.  */
  10. Prototype UBYTE DiskTracks[ 100 ][ 64 ], DiskName[ 64 ], Artist[ 64 ], DiskLabel[ 64 ];
  11. Prototype Object *WO_Disk, *GO_Disk, *GO_Artist, *GO_DiskLabel, *GO_DiskTrack, *GO_DiskList;
  12. Prototype struct Window *Disk;
  13. Prototype ULONG DiskSig;
  14.  
  15. UBYTE        DiskTracks[ 100 ][ 64 ];    /* Names of the tracks on the disk. */
  16. UBYTE        DiskName[ 64 ];                 /* Title of the disk.            */
  17. UBYTE        Artist[ 64 ];            /* Artist.                */
  18. UBYTE        DiskLabel[ 64 ];        /* Disk label.                */
  19. UWORD        TrackIdx;            /* Index for reading disk files.    */
  20.  
  21. /*
  22.  *    Disk editor window data.
  23.  */
  24. Object           *WO_Disk, *GO_DiskList, *GO_Disk, *GO_Artist, *GO_DiskLabel, *GO_DiskTrack, *GO_Save;
  25. struct Window  *Disk;
  26. ULONG        DiskSig;
  27.  
  28. /*
  29.  *    A resource hook which prevents the listview class
  30.  *    to make a private copy of the added entries.
  31.  */
  32. SAVEDS ASM APTR ListHookFunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct lvResource *lvr )
  33. {
  34.     return( lvr->lvr_Entry );
  35. }
  36.  
  37. /*
  38.  *    Control the listview with the cursor keys.
  39.  */
  40. SAVEDS ASM VOID ScrollHookFunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct IntuiMessage *msg )
  41. {
  42.     struct Window            *window;
  43.     Object                *lv_obj = ( Object * )hook->h_Data;
  44.  
  45.     /*
  46.      *    Obtain window pointer.
  47.      */
  48.     GetAttr( WINDOW_Window,        obj,    ( ULONG * )&window );
  49.  
  50.     /*
  51.      *    What key is pressed?
  52.      */
  53.     switch ( msg->Code ) {
  54.  
  55.         case    0x4C:
  56.             /*
  57.              *    UP.
  58.              */
  59.             if ( msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  60.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_Page_Up, TAG_END );
  61.             else if ( msg->Qualifier & IEQUALIFIER_CONTROL )
  62.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_First, TAG_END );
  63.             else
  64.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_Previous, TAG_END );
  65.             break;
  66.  
  67.         case    0x4D:
  68.             /*
  69.              *    DOWN.
  70.              */
  71.             if ( msg->Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
  72.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_Page_Down, TAG_END );
  73.             else if ( msg->Qualifier & IEQUALIFIER_CONTROL )
  74.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_Last, TAG_END );
  75.             else
  76.                 SetGadgetAttrs(( struct Gadget * )lv_obj, window, NULL, LISTV_Select, LISTV_Select_Next, TAG_END );
  77.             break;
  78.     }
  79. }
  80.  
  81. static struct Hook ListHook   = { NULL, NULL, (HOOKFUNC)ListHookFunc,    NULL, NULL };
  82. static struct Hook ScrollHook = { NULL, NULL, (HOOKFUNC)ScrollHookFunc, NULL, NULL };
  83.  
  84. /*
  85.  *    Open the disk editor.
  86.  */
  87. Prototype BOOL OpenDiskWindow( void );
  88.  
  89. BOOL OpenDiskWindow( void )
  90. {
  91.     UWORD            i;
  92.  
  93.     /*
  94.      *    Object already created?
  95.      */
  96.     if ( ! WO_Disk ) {
  97.         /*
  98.          *    Create listview object.
  99.          */
  100.         GO_DiskList = ListviewObject,
  101.             GA_ID,            ID_DISKLIST,
  102.             LISTV_ResourceHook,    &ListHook,
  103.             ICA_TARGET,        ICTARGET_IDCMP,
  104.         EndObject;
  105.         /*
  106.          *    Set it in the window
  107.          *    IDCMP hook.
  108.          */
  109.         ScrollHook.h_Data = ( APTR )GO_DiskList;
  110.         /*
  111.          *    Create the window.
  112.          */
  113.         WO_Disk = WindowObject,
  114.             WINDOW_Title,        VERS " (" DATE ") - Edit Disk",
  115.             WINDOW_AutoAspect,    TRUE,
  116.             WINDOW_RMBTrap,         TRUE,
  117.             WINDOW_SmartRefresh,    TRUE,
  118.             WINDOW_PubScreenName,    PubScreen,
  119.             WINDOW_ScaleWidth,    20,
  120.             WINDOW_ScaleHeight,    20,
  121.             WINDOW_IDCMPHook,    &ScrollHook,
  122.             WINDOW_IDCMPHookBits,    IDCMP_RAWKEY,
  123.             WINDOW_SharedPort,    SharedPort,
  124.             WINDOW_MasterGroup,
  125.                 VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ), GROUP_BackFill, SHINE_RASTER,
  126.                     StartMember,
  127.                         VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
  128.                             FRM_Type,        FRTYPE_BUTTON,
  129.                             FRM_Recessed,        TRUE,
  130.                             StartMember, GO_Disk      = KeyString( "_Title:",  DiskName,  64, ID_CD     ), FixMinHeight, EndMember,
  131.                             StartMember, GO_Artist      = KeyString( "_Artist:", Artist,    64, ID_ARTIST ), FixMinHeight, EndMember,
  132.                             StartMember, GO_DiskLabel = KeyString( "_Label:",  DiskLabel, 64, ID_LABEL  ), FixMinHeight, EndMember,
  133.                             StartMember,
  134.                                 VGroupObject, Spacing( 1 ),
  135.                                     StartMember, GO_DiskList, EndMember,
  136.                                     StartMember, GO_DiskTrack = String( NULL, NULL, 64, ID_TRACK ), FixMinHeight, EndMember,
  137.                                 EndObject,
  138.                             EndMember,
  139.                         EndObject,
  140.                     EndMember,
  141.                     StartMember,
  142.                         HGroupObject, Spacing( 4 ),
  143.                             VarSpace( DEFAULT_WEIGHT ),
  144.                             StartMember, GO_Save   = KeyButton( "_Save",   ID_SAVEDISK   ), EndMember,
  145.                             VarSpace( DEFAULT_WEIGHT ),
  146.                         EndObject, FixMinHeight,
  147.                     EndMember,
  148.                 EndObject,
  149.         EndObject;
  150.  
  151.         if ( WO_Disk ) {
  152.             /*
  153.              *    Add hotkeys/tab cycling.
  154.              */
  155.             GadgetKey( WO_Disk, GO_Disk,     "t" );
  156.             GadgetKey( WO_Disk, GO_Artist,     "a" );
  157.             GadgetKey( WO_Disk, GO_DiskLabel,"l" );
  158.             GadgetKey( WO_Disk, GO_Save,     "s" );
  159.             DoMethod( WO_Disk, WM_TABCYCLE_ORDER, GO_Disk, GO_Artist, GO_DiskLabel, NULL );
  160.         }
  161.     } else {
  162.         /*
  163.          *    Reset string contents.
  164.          */
  165.         SetAttrs( GO_Disk,    STRINGA_TextVal, DiskName,  TAG_END );
  166.         SetAttrs( GO_Artist,    STRINGA_TextVal, Artist,    TAG_END );
  167.         SetAttrs( GO_DiskLabel, STRINGA_TextVal, DiskLabel, TAG_END );
  168.         SetAttrs( GO_DiskTrack, STRINGA_TextVal, NULL,        TAG_END );
  169.     }
  170.  
  171.     if ( WO_Disk ) {
  172.         /*
  173.          *    Empty the listview.
  174.          */
  175.         ClearList( NULL, GO_DiskList );
  176.         /*
  177.          *    Add entries.
  178.          */
  179.         for ( i = 0; i < TOCNumTracks; i++ )
  180.             AddEntry( NULL, GO_DiskList, &DiskTracks[ i ][ 0 ], LVAP_TAIL );
  181.         /*
  182.          *    Open the window.
  183.          */
  184.         if ( Disk = WindowOpen( WO_Disk )) {
  185.             GetAttr( WINDOW_SigMask, WO_Disk, &DiskSig );
  186.             return( TRUE );
  187.         }
  188.     }
  189.     return( FALSE );
  190. }
  191.  
  192. /*
  193.  *    Close the disk editor.
  194.  */
  195. Prototype VOID CloseDiskWindow( void );
  196.  
  197. VOID CloseDiskWindow( void )
  198. {
  199.     WindowClose( WO_Disk );
  200.     Disk    = NULL;
  201.     DiskSig = 0L;
  202. }
  203.  
  204. /*
  205.  *    Load disk file.
  206.  */
  207. Prototype VOID LoadDiskFile( void );
  208.  
  209. /*
  210.  *    The disk files know two commands.
  211.  */
  212. static VOID ParseCD( ULONG * );
  213. static VOID ParseTrack( ULONG * );
  214.  
  215. static CONFIGCOMM CDCommands[] = {
  216.     { "CD",         "NAME,ARTIST,LABEL",    ParseCD         },
  217.     { "TRACK",      "NAME/F",               ParseTrack      }
  218. };
  219.  
  220. /*
  221.  *    Evaluate the CD command.
  222.  */
  223. static VOID ParseCD( ULONG *args )
  224. {
  225.     if ( args[ 0 ] ) strncpy( DiskName,  ( UBYTE * )args[ 0 ], 64 );
  226.     if ( args[ 1 ] ) strncpy( Artist,    ( UBYTE * )args[ 1 ], 64 );
  227.     if ( args[ 2 ] ) strncpy( DiskLabel, ( UBYTE * )args[ 2 ], 64 );
  228. }
  229.  
  230. /*
  231.  *    Evaluate the TRACK command.
  232.  */
  233. static VOID ParseTrack( ULONG *args )
  234. {
  235.     if ( args[ 0 ] )
  236.         strncpy( &DiskTracks[ TrackIdx++ ][ 0 ], ( UBYTE * )args[ 0 ], 64 );
  237. }
  238.  
  239. /*
  240.  *    Load the disk file from the specified
  241.  *    directory.
  242.  */
  243. VOID LoadDiskFile( void )
  244. {
  245.     UBYTE        path[ 256 ];
  246.     ULONG        line = 0;
  247.  
  248.     /*
  249.      *    Build the filename of this disk.
  250.      */
  251.     strncpy( path, DiskPath, 256 );
  252.     AddPart( path, CDID, 256 );
  253.     /*
  254.      *    Reset track index.
  255.      */
  256.     TrackIdx = 0;
  257.     /*
  258.      *    Load the disk file.
  259.      */
  260.     if ( ReadConfigFile( path, CDCommands, &line )) {
  261.         /*
  262.          *    Oops. This file does not exist
  263.          *    or an error occured.
  264.          */
  265.         strcpy( DiskName,  "<Unknown>" );
  266.         strcpy( Artist,    "<Unknown>" );
  267.         strcpy( DiskLabel, "<Unknown>" );
  268.         for ( line = 0; line < TOCNumTracks; line++ )
  269.             strcpy( &DiskTracks[ line ][ 0 ], "<Unknown>" );
  270.     }
  271. }
  272.  
  273. /*
  274.  *    Save the current disk file.
  275.  */
  276. Prototype VOID SaveDiskFile( void );
  277.  
  278. static VOID Fprintf( BPTR handle, UBYTE *fstr, ... )
  279. {
  280.     VFPrintf( handle, fstr, ( ULONG * )( & fstr + 1 ));
  281. }
  282.  
  283. VOID SaveDiskFile( void )
  284. {
  285.     UBYTE    path[ 256 ], i;
  286.     BPTR    file;
  287.  
  288.     /*
  289.      *    Build file name.
  290.      */
  291.     strncpy( path, DiskPath, 256 );
  292.     AddPart( path, CDID, 256 );
  293.     /*
  294.      *    Does this file already exist?
  295.      */
  296.     if ( file = Open( path, MODE_OLDFILE )) {
  297.         if ( ! ReportError( "_Yes|_No", ISEQ_C ISEQ_B "This CD file already exists!\n"
  298.                     ISEQ_N "Overwrite?" )) {
  299.             Close( file );
  300.             return;
  301.         } else
  302.             Close( file );
  303.     }
  304.     /*
  305.      *    Write the CD and TRACK commands.
  306.      */
  307.     if ( file = Open( path, MODE_NEWFILE )) {
  308.         Fprintf( file, "CD \"%s\" \"%s\" \"%s\"\n", DiskName, Artist, DiskLabel );
  309.         for ( i = 0; i < TOCNumTracks; i++ )
  310.             Fprintf( file, "TRACK %s\n", &DiskTracks[ i ][ 0 ] );
  311.         Close( file );
  312.     }
  313. }
  314.